#include <iostream>
#include <memory>
#include <vector>
using std::cout;
using std::endl;
using std::vector;
using std::unique_ptr;

void test(){
    unique_ptr<int> up(new int(10));
    //unique_ptr<int> up2 = up;//拷贝构造函数
    //右操作数所托管的指针变为空指针
    //左操作数接收指针
    unique_ptr<int> up3 = std::move(up);//调用的是移动构造
    cout << up3.get() << endl;
    cout << up.get() << endl;
}


class Point{
public:
    Point(int x, int y)
    :_x(x)
    ,_y(y)
    {

    }

    void print(){
        cout << _x << "," << _y << endl;
    }

private:
    int _x;
    int _y;
};

//把智能指针比如unique_ptr等放入到容器中，其实就是和
//之前把裸指针放入到容器中是一回事
//智能指针如何使用？？
//后续凡是使用指针的地方，其实都可以使用智能指针包裹
//可以根据是独享还是共享，选择unique_ptr还是shared_ptr
//使用过程和裸指针没有任何区别
//后续不需要释放堆空间
void test2(){
    //vector里面的元素存放在哪里的？？？堆
    //3根指针 头  size  capacity
    //up在哪？？？？？栈
    unique_ptr<Point> up(new Point(1, 2));
    vector<unique_ptr<Point>> vec;
    //所以将up放入vec中，肯定需要拷贝一份
    //但是unique_ptr的拷贝构造函数被删除了
    vec.push_back(std::move(up)); //error
    
    cout << up.get() << endl;
    //up->print();
    //cout << *up << endl;

}

void test3(){
    unique_ptr<Point> up(new Point(1, 2));
    vector<unique_ptr<Point>> vec;
    //vector里面存储unique_ptr的方式1
    vec.push_back(std::move(up));
    //vector里面存储unique_ptr的方式2：直接存入一个右值
    //直接走移动构造函数
    //会把Point(3, 4)的控制权交给vec里面创建的up
    vec.push_back(unique_ptr<Point>(new Point(3, 4)));
}

int main()
{
    test2();
    return 0;
}

